package com.robert.maps.applib.tileprovider; import java.util.ConcurrentModificationException; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.Map.Entry; import android.graphics.Bitmap; public class MapTileMemCache { private static final int CACHE_MAPTILECOUNT_DEFAULT = 5; private int mSize; protected LinkedHashMap<String, Bitmap> mHardCachedTiles; public MapTileMemCache(){ this(CACHE_MAPTILECOUNT_DEFAULT); } public MapTileMemCache(final int aMaximumCacheSize){ this.mHardCachedTiles = new LinkedHashMap<String, Bitmap>(aMaximumCacheSize, 0.75f, true); mSize = aMaximumCacheSize; } public synchronized Bitmap getMapTile(final String aTileURLString) { if(aTileURLString != null) { final Bitmap bmpHard = this.mHardCachedTiles.get(aTileURLString); if(bmpHard != null){ if(!bmpHard.isRecycled()) { return bmpHard; } } } return null; } public synchronized void putTile(final String aTileURLString, final Bitmap aTile) { this.mHardCachedTiles.put(aTileURLString, aTile); if(mHardCachedTiles.size() > mSize) { Iterator<String> it = mHardCachedTiles.keySet().iterator(); if(it.hasNext()) { final String key = it.next(); final Bitmap bmpHard = this.mHardCachedTiles.get(key); if(bmpHard != null){ if(!bmpHard.isRecycled()) { bmpHard.recycle(); } } mHardCachedTiles.remove(key); } } } public void removeTile(final String aTileURLString) { if(mHardCachedTiles.containsKey(aTileURLString)) { final Bitmap bmpHard = this.mHardCachedTiles.get(aTileURLString); if(bmpHard != null){ if(!bmpHard.isRecycled()) { bmpHard.recycle(); } } mHardCachedTiles.remove(mHardCachedTiles); } } public synchronized void Commit() { } public synchronized void Resize(final int size) { if(size > mSize){ mSize = size; final LinkedHashMap<String, Bitmap> hardCache = new LinkedHashMap<String, Bitmap>(size, 0.75f, true); hardCache.putAll(mHardCachedTiles); mHardCachedTiles = hardCache; } } public void Free() { try { Iterator<Entry<String, Bitmap>> it = mHardCachedTiles.entrySet().iterator(); while(it.hasNext()) { final Bitmap bmpHard = it.next().getValue(); if(bmpHard != null){ if(!bmpHard.isRecycled()) { bmpHard.recycle(); } } } } catch (ConcurrentModificationException e) { // TODO It's need other iteration code } mHardCachedTiles.clear(); mSize = 0; } }